//    |  /           |
//    ' /   __| _` | __|  _ \   __|
//    . \  |   (   | |   (   |\__ `
//   _|\_\_|  \__,_|\__|\___/ ____/
//                   Multi-Physics
//
//  License:		 BSD License
//					 Kratos default license: kratos/license.txt
//
//  Main authors:    Inigo Lopez and Riccardo Rossi
//

#if !defined(KRATOS_COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION_VARIABLES_H_INCLUDED)
#define KRATOS_COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION_VARIABLES_H_INCLUDED

// System includes

// External includes

// Project includes
#include "includes/define.h"
#include "includes/variables.h"
#include "includes/kratos_application.h"
#include "includes/checks.h"

namespace Kratos
{
// Degrees of freedom
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, VELOCITY_POTENTIAL)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, AUXILIARY_VELOCITY_POTENTIAL)

// Reaction variables (Degrees of freedom)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, REACTION_VELOCITY_POTENTIAL)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, REACTION_AUXILIARY_VELOCITY_POTENTIAL)

//Embedded variables
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, GEOMETRY_DISTANCE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, ROTATION_ANGLE)

//Wake variables
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, WAKE_DISTANCE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, Vector, WAKE_ELEMENTAL_DISTANCES)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, Vector, WAKE_ORIGIN)

// Adjoint variables
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, ADJOINT_VELOCITY_POTENTIAL)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, ADJOINT_AUXILIARY_VELOCITY_POTENTIAL)

// Flow field magnitudes
KRATOS_DEFINE_3D_APPLICATION_VARIABLE_WITH_COMPONENTS(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, PERTURBATION_VELOCITY)
KRATOS_DEFINE_3D_APPLICATION_VARIABLE_WITH_COMPONENTS(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, VELOCITY_LOWER)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, PRESSURE_LOWER)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, POTENTIAL_JUMP)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, ENERGY_NORM_REFERENCE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, POTENTIAL_ENERGY_REFERENCE)

// Free stream magnitudes
KRATOS_DEFINE_3D_APPLICATION_VARIABLE_WITH_COMPONENTS(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, FREE_STREAM_VELOCITY)
KRATOS_DEFINE_3D_APPLICATION_VARIABLE_WITH_COMPONENTS(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, FREE_STREAM_VELOCITY_DIRECTION)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, FREE_STREAM_DENSITY)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, FREE_STREAM_MACH)

// Integral magnitudes
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, LIFT_COEFFICIENT)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, MOMENT_COEFFICIENT)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, LIFT_COEFFICIENT_JUMP)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, LIFT_COEFFICIENT_FAR_FIELD)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, DRAG_COEFFICIENT_FAR_FIELD)

// Geometrical variables
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, REFERENCE_CHORD)
KRATOS_DEFINE_3D_APPLICATION_VARIABLE_WITH_COMPONENTS(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, WAKE_NORMAL)
KRATOS_DEFINE_3D_APPLICATION_VARIABLE_WITH_COMPONENTS(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, WING_SPAN_DIRECTION)
KRATOS_DEFINE_3D_APPLICATION_VARIABLE_WITH_COMPONENTS(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, VECTOR_TO_UPWIND_ELEMENT)

// Solver parameters
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, MACH_LIMIT)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, CRITICAL_MACH)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, double, UPWIND_FACTOR_CONSTANT)

// Solver settings
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, ECHO_LEVEL)

// Markers
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, WAKE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, KUTTA)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, WING_TIP)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, WING_ROOT)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, bool, TRAILING_EDGE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, bool, UPPER_SURFACE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, bool, LOWER_SURFACE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, bool, UPPER_WAKE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, bool, LOWER_WAKE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, AIRFOIL)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, FAR_FIELD)

// To be removed
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, TRAILING_EDGE_ELEMENT)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, DECOUPLED_TRAILING_EDGE_ELEMENT)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, DEACTIVATED_WAKE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, ALL_TRAILING_EDGE)
KRATOS_DEFINE_APPLICATION_VARIABLE(COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION, int, ZERO_VELOCITY_CONDITION)
} // namespace Kratos

#endif /* KRATOS_COMPRESSIBLE_POTENTIAL_FLOW_APPLICATION_VARIABLES_H_INCLUDED */
